#include "app_common.h"
#include <stddef.h>
#include <sys/time.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

long app_common_getCurrentTime(void)
{
    struct timeval tv;
    // 获取当前时区的时间
    gettimeofday(&tv, NULL);
    // tv_sec是秒数，tv_usec是微秒数；
    return (long)tv.tv_sec * 1000 + (long)tv.tv_usec / 1000;
}

/**
 * @brief 字符数组转16进制字符串
 * 
 * @param chars 字符数组
 * @param len 字符数组实际长度
 * @return char* 16进制字符串
 */
char *app_common_charsToHexstr(char *chars, int len)
{
    // 申请16进制字符串的空间
    char *hexstr = (char *)malloc(len * 2 + 1);
    if (hexstr == NULL) {
        return NULL;
    }
    // 循环遍历字符数组，将每个字符转为两位16进制字符串
    for (int i = 0; i < len; i++) {
        sprintf(hexstr + i * 2, "%02x",chars[i]);
    }
    // 最后添加一个'\0'结束符
    hexstr[len * 2] = '\0';
    return hexstr;
}

/**
 * @brief 16进制字符串转字符数组
 * 
 * @param hexstr 16进制字符串
 * @param chars_len 字符数组实际长度
 * @return char* 字符数组
 */
char *app_common_hexstrToChars(char *hexstr, int *chars_len)
{
    // 得到16进制字符串长度
    int hexstr_len = strlen(hexstr);
    // 计算字符数组实际长度
    *chars_len = hexstr_len / 2;
    // 申请字符数组的空间
    char *chars = (char *)malloc(hexstr_len / 2);
    if (chars == NULL) {
        return NULL;
    }
    // 循环遍历16进制字符串，将每个两位16进制字符串转为字符
    for (int i = 0; i < hexstr_len; i += 2) {
            sscanf(hexstr + i, "%2hhx", (unsigned char *)(chars + i / 2));
    }
    return chars;
}
